#!/usr/bin/python3
# ******************************************************************************
# Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved.
# licensed under the Mulan PSL v2.
# You can use this software according to the terms and conditions of the Mulan PSL v2.
# You may obtain a copy of Mulan PSL v2 at:
#     http://license.coscl.org.cn/MulanPSL2
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
# PURPOSE.
# See the Mulan PSL v2 for more details.
# ******************************************************************************/
# 统计代码量，显示离10W行代码还有多远
# 递归搜索各个文件夹
# 显示各个类型的源文件和源代码数量
# 显示总行数与百分比

import os
import easygui as g


# 查找文件
def find_file(file_path, target):
    os.chdir(file_path)
    all_files = os.listdir(os.curdir)
    for each in all_files:
        # print(each)
        fext = os.path.splitext(each)[1]
        if fext in target:
            lines = calc_code(each)  # 统计行数
            # print("文件%s的代码行数是%d"%(each,lines))
            # 统计文件数
            try:
                file_list[fext] += 1
            except KeyError:
                file_list[fext] = 1
            # 统计源代码行数
            try:
                source_list[fext] += lines
                # print(source_list[fext])
            except KeyError:
                source_list[fext] = lines
                # print(source_list[fext])

        if os.path.isdir(each):
            find_file(each, target)  # 递归调用
            os.chdir(os.pardir)  # 返回上层目录


# 统计行数
def calc_code(file_name):
    lines = 0
    with open(file_name, encoding='gb18030', errors='ignore') as f:
        print("正在分析文件%s..." % file_name)
        try:
            for eachline in f:
                lines += 1
        except UnicodeDecodeError:
            pass
        print("文件%s分析完毕，包含代码行%d." % (file_name, lines))
    return lines


# 显示结果
def show_result(start_dir):
    lines = 0
    total = 0
    text = ''

    for i in source_list:
        lines = source_list[i]
        total += lines
        text += '%s源文件%d个，源代码%d行\n' % (i, file_list[i], lines)

    title = '统计结果'
    msg = '目前代码行数：%d\n完成进度：%.2f%%\n距离十万行代码还差%d行' % (total, total / 1000, 100000 - total)
    g.msgbox(msg, title, text)


# file_path=input("要查找的路径； ")  # C:\\Users\\54353\\PycharmProjects\\untitled
target = ['.py', '.java_learn', '.c', '.cc', '.cpp', '.sh', '.config']  # 定义需要查找的源文件类型
file_list = {}
source_list = {}
g.msgbox('请打开您的文件夹', '统计代码量')
path = g.diropenbox('请选择您的代码库：')

find_file(path, target)
show_result(path)
